package com.ball.dev.service.impl;

import com.ball.common.dtos.ResponseResult;
import com.ball.common.enums.AppHttpCodeEnum;
import com.ball.common.utils.BeanUtils;
import com.ball.dev.entity.po.Options;
import com.ball.dev.entity.po.Problem;
import com.ball.dev.entity.vo.ProblemVo;
import com.ball.dev.mapper.ProblemMapper;
import com.ball.dev.service.IOptionService;
import com.ball.dev.service.IProblemService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 调查问卷 服务实现类
 * </p>
 *
 * @author lou
 * @since 2024-04-15
 */
@Service
@RequiredArgsConstructor
public class ProblemServiceImpl extends ServiceImpl<ProblemMapper, Problem> implements IProblemService {

    private final IOptionService optionService;
    @Override
    public ResponseResult addProblem(Problem problem) {
        problem.setCreateTime(LocalDateTime.now());
        return save(problem) ?
                ResponseResult.okResult("添加成功") :
                ResponseResult.errorResult(AppHttpCodeEnum.PARAM_REQUIRE,"添加失败");
    }

    /**
     * 列出所有问题的信息。
     *
     * 该方法不接受任何参数，返回一个包含所有问题信息的响应结果对象。
     * 具体实现过程为：首先查询所有问题的信息，然后为每个问题查询其选项，并将问题及其选项封装成ProblemVo对象，
     * 最后将所有ProblemVo对象作为结果返回。
     *
     * @return ResponseResult 包含所有问题信息的响应结果对象。
     */
    @Override
    public ResponseResult listProblem() {
        // 查询所有问题
        List<Problem> problems = lambdaQuery().list();
        ArrayList<ProblemVo> problemVos = new ArrayList<>(problems.size());
        if (problems.size() > 0){
            for (Problem problem : problems) {
                // 设置问题的某个值为null（具体用途根据实际业务解释）
                problem.setValue(null);
                // 将Problem对象复制到ProblemVo对象
                ProblemVo problemVo = BeanUtils.copyBean(problem, ProblemVo.class);
                // 查询问题的所有选项，并按选项值升序排序
                List<Options> options =
                        optionService.lambdaQuery().eq(Options::getProblemId, problem.getId()).orderByAsc(Options::getValue).list();
                // 将选项设置到ProblemVo对象
                problemVo.setOptions(options);
                problemVos.add(problemVo);
            }
        }
        // 返回包含所有问题信息的结果
        return ResponseResult.okResult(problemVos);
    }
}
